Traditionally, parallel processing refers to the concept of speeding-up the execution of a program by dividing the program into multiple fragments that can execute concurrently, each on its own processor. A program being executed across n processors might execute n times faster than it would using a single processor. The terms concurrently and parallel are used to refer to the situation where the period for executing two or more processes overlap in time, even if they start and stop at different times. Most computers have just one processor, but some models have several. With single or multiple processor computers, it is possible to perform parallel processing by connecting multiple computers in a network and distributing portions of the program to different computers on the network.
In practice, however, it is often difficult to divide a program in such a way that separate processors can execute different portions of a program without interfering with each other. One idea to facilitate the use of parallel processing is for the developer to use a graph that defines how the various portions of a job will be executed in parallel by the execution engine. The graph can be used by the execution engine to manage the parallel processing. However, a graph created by a software developer may not make most efficient use of the execution engine because the developer may not be aware of the topology of the execution engine or other variables that effect performance.